package donkeykong;

import java.awt.Container;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.io.File;
import java.io.IOException;


import javax.imageio.ImageIO;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip;
import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.UnsupportedAudioFileException;
import javax.swing.JPanel;

/**
 * 
 * @author Antonio Cebollada, Miguel Castillo, José Ignacio Castro
 *
 */
public class Menu_inicio extends JPanel{
	
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	/** Numero de vidas iniciales de Mario **/
	private static final int VIDAS_INICIALES = 30;
	/** Imagen del menu de inicio **/
	public static Image pantalla_inicio;
	/** Imagen del cursor **/
	public static Image cursor;
	/** Posicion x del cursor**/
	public static int posx;
	/** Posicion y del cursor**/
	public static int posy;
	/** Posicion x inicial en la que se coloca el cursor **/
	public int posicion_cursor_X = 170;
	/** Posicion y inicial en la que se coloca el cursor **/
	public int posicion_cursor_Y = 350;

	/** Dificultad del juego, se modifica si se elige modo A o modo B **/
	public boolean AltaDificultad;
	
	/** Stream de la musica que suena**/
	public AudioInputStream musica;
	/** Clip que permite iniciar o parar la musica, entre otras opciones **/
	public Clip clickClip;
	/** Thread que se utiliza para lanzar un codigo en segundo plano **/
	private Thread r;
	private Container con;
	
	private int TECLA_ARRIBA;
	private int TECLA_ABAJO;
	private int TECLA_DERECHA;
	private int TECLA_IZQUIERDA;
	private int TECLA_SALTO;
	private int TECLA_START;
	private Menu_inicio menu;
	
	/**Constructor predeterminado de la clase**/
	public Menu_inicio(){
		
		try {
			TECLA_ARRIBA= 38;
			TECLA_ABAJO=40;
			TECLA_DERECHA=39;
			TECLA_IZQUIERDA= 37;
			TECLA_SALTO=(int) ' ';
			TECLA_START=(int) '\n';;
			
			
			initComponents();
			jPanel1.setVisible(false);
			setVisible(true);
			posx= posicion_cursor_X;
			posy= posicion_cursor_Y;
			cursor = ImageIO.read(new File("./images/cursor.png"));
			pantalla_inicio = ImageIO.read(new File("./images/Pantalla_inicio.jpg"));
			setSize(pantalla_inicio.getWidth(null),pantalla_inicio.getHeight(null));
			ClaseListener cl = new ClaseListener();
			addKeyListener(cl);
			setFocusable(true);
			setRequestFocusEnabled(true);
	        requestFocusInWindow();
		    clickClip = AudioSystem.getClip();
			musica = AudioSystem.getAudioInputStream(new File("./sounds/main_theme.wav"));
			clickClip.open(musica);
			clickClip.loop(Clip.LOOP_CONTINUOUSLY);
			clickClip.start();
			
			
		} catch (IOException e) {
			e.printStackTrace();
		} catch (UnsupportedAudioFileException e) {
			e.printStackTrace();
		} catch (LineUnavailableException e) {
			e.printStackTrace();
		}
	}
	
	
	/** Funcion paintComponent que es propia de los JPanels, que sirve para dibujar en el mismo la imagen que se quiera, entre otras opciones**/
	public void paintComponent(Graphics g)
	{
		super.paintComponent(g);
		Graphics2D g2d = (Graphics2D) g;
		/** Pintar la imagen del menu de inicio, colocando la esquina superior izquierda en la posicion 0,0 **/
		g2d.drawImage(pantalla_inicio, 0, 0, null);
		/** Pintar la imagen del cursor, colocando la esquina superior izquierda en la posicion x e y correspondiente **/
		g2d.drawImage(cursor,posx,posy,null);
		g2d.dispose();

	}

	
	/** Funcion que pone en ejecución el sonido de inicio del juego, durante 5.5 segundos, para que se escuche entero.
	 *  Se ejecuta en una clase runnable para poder hacer el Thread.sleep y detener el avance del codigo durante un tiempo.
	 */
	public void EmpezarPartida(){
		try {
			
			/** Paramos la musica del menú de inicio **/
			clickClip.stop();
			repaint();
			/** Definimos el Thread como un runnable que se encarga de esperar 5.5 segundos y despues invoca el metodo de AbrirIntermedio **/
			r = new Thread(new Runnable() {
				
				@Override
				public void run() {
					try {
						Thread.sleep(5500);
						clickClip.stop();
						clickClip.close();
						musica.close();
						AbrirIntermedio();
					} catch (InterruptedException e) {
						e.printStackTrace();
					} catch (IOException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}				
					
				}
			});
			
			clickClip.stop();
			clickClip.close();
			musica.close();
			/** Poner la musica de entrada al juego. **/
			clickClip = AudioSystem.getClip();
			musica = AudioSystem.getAudioInputStream(new File("./sounds/intro.wav"));
			clickClip.open(musica);
			clickClip.loop(1);
			clickClip.start();
			/** Iniciar ahora el Thread, para que espere los 5.5 segundos y continue con el juego **/
			r.start();
			
		} catch (UnsupportedAudioFileException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} catch (LineUnavailableException e) {
			e.printStackTrace();
		}
	}
	
	/** Funcion que muestra la pantalla de intermedio entre escenas, y le pasa ciertos parametros como vidas, dificultad, multijugador **/
	private void AbrirIntermedio() {
		clickClip.stop();
		repaint();
		Puntuacion_total pt = new Puntuacion_total(TECLA_ABAJO,TECLA_ARRIBA,TECLA_DERECHA,TECLA_IZQUIERDA,TECLA_SALTO,TECLA_START,(!AltaDificultad?1:3));
		Intermedio it = new Intermedio(1,VIDAS_INICIALES,(!AltaDificultad?1:3),pt);
		
		/** Este codigo sirve para librar al procesador de carga inutil, lo que hacemos es meter al JFrame el nuevo Jpanel que se va a mostrar
		 * y quitar el que estamos viendo ahora, para no dejar Jpanels activos innecesariamente. 
		 **/
		/** Añadimos el Jpanel Intermedio al Frame**/
		getParent().add(it);
		/** Lo ponemos como visible para poder mostrarlo por pantalla**/
		it.setVisible(true);
		/** El Jpanel en el que estamos lo ponemos como no visible, y procedemos a quitarlo del JFrame **/
		setVisible(false);
		getParent().remove(this);
	
		/** Repintar y poner al JPanel Intermedio como ventana principal, para que se puedan guardar los eventos que ocurran en ella. **/
		repaint();
		it.requestFocusInWindow();		
	}	
	
	public void AbrirMenuTeclas(){
		
		/** Añadimos el Jpanel Intermedio al Frame**/
		getParent().add(jPanel1);
		/** Lo ponemos como visible para poder mostrarlo por pantalla**/
		jPanel1.setVisible(true);
		/** El Jpanel en el que estamos lo ponemos como no visible, y procedemos a quitarlo del JFrame **/
		setVisible(false);
		con= getParent();
		menu=this;
		getParent().remove(this);
		/** Repintar y poner al JPanel Intermedio como ventana principal, para que se puedan guardar los eventos que ocurran en ella. **/
		jPanel1.requestFocusInWindow();	
		revalidate();
		
		
	}

	public void CerrarMenuTeclas(){
		
		/** Lo ponemos como visible para poder mostrarlo por pantalla**/

		/** El Jpanel en el que estamos lo ponemos como no visible, y procedemos a quitarlo del JFrame **/
		jPanel1.setVisible(false);
		
		con.add(menu);
		con.remove(jPanel1);
		
		setVisible(true);
		/** Repintar y poner al JPanel Intermedio como ventana principal, para que se puedan guardar los eventos que ocurran en ella. **/
		requestFocusInWindow();
		revalidate();
	}
	
	
	/** Clase que implementa el listerner de las teclas del teclado**/
	private class ClaseListener extends KeyAdapter{
	

		/** Variable booleana que es cierta cuando una de las opciones ya se ha seleccionado, sirve para que no se seleccionen mas de una opción
		 * a la vez
		 */
		private boolean press=false;

		/**
		 *  Funcion que envia un KeyEvent cuando una tecla del teclado se pulsa
		 *  @param eventoTecla : evento de la tecla que se ha pulsado, se puede obtener a partir de este evento qué tecla se ha pulsado.
		 */
		
		public void keyPressed(KeyEvent eventoTecla) {
			if (!press){
				try{
					
				/**Si se pulsa la tecla de arriba, el cursor se ha de colocar en la opcion por encima de la actual, si no esta ya en la mas
				 * superior
				 */
				if (eventoTecla.getKeyCode() == TECLA_ARRIBA){	
					if (posy != 350){	
						posy -= 47;	
					}	
					
					
				/**Si se pulsa la tecla de abajo, el cursor se ha de colocar en la opcion por debajo de la actual, si no esta ya en la mas
				 * inferior
				 */
				}else if (eventoTecla.getKeyCode() == TECLA_ABAJO){	
					if (posy != 491){	
						posy += 47;	
					}
					
				/**Si se pulsa la tecla de start, se debe escoger la dificultad y el modo multijugador según en que opción esté 
				 * situado el cursor, mirando su coordenada y. Tambien se activa el booleano para impedir mas selecciones, y se inicia la partida
				 */	
				}else if (eventoTecla.getKeyCode() == TECLA_START){
					press=true;
					// Si salir,
					if (posy == 491){
						System.exit(0);
					}else if (posy == 444){
						// Cambiar teclas
						// Poner lo de cambiar teclas UP,DOWN,RIGHT,LEFT,A.
						AbrirMenuTeclas();	
						press=false;
						
					}else{
						AltaDificultad = ((posy==350)?false:true);  //   0 para dificultad baja, 1 para dificultad alta
						EmpezarPartida();
					}
					
					
				}
				/** Repintar siempre despues de cualquier evento, para que se muestre reflejado en la ventana. **/
				repaint();
				
				}catch(Exception e){
					e.printStackTrace();
				}		
			}
		}
	
	}
	
	   /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the FormEditor.
     */
	   // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
    @SuppressWarnings({ "rawtypes", "unchecked" })
	private void initComponents() {
        java.awt.GridBagConstraints gridBagConstraints;

        jPanel1 = new javax.swing.JPanel();
        TEXTOARRIBA = new javax.swing.JLabel();
        TeclaArriba = new javax.swing.JComboBox();
        jLabel3 = new javax.swing.JLabel();
        TeclaAbajo = new javax.swing.JComboBox();
        TEXTOABAJO = new javax.swing.JLabel();
        TEXTOIZQUIERDA = new javax.swing.JLabel();
        TeclaIzquierda = new javax.swing.JComboBox();
        TEXTODERECHA = new javax.swing.JLabel();
        TeclaDerecha = new javax.swing.JComboBox();
        TEXTOSALTAR = new javax.swing.JLabel();
        TeclaSaltar = new javax.swing.JComboBox();
        TEXTOSTART = new javax.swing.JLabel();
        TeclaStart = new javax.swing.JComboBox();
        Aplicar = new javax.swing.JButton();

        setLayout(new java.awt.GridBagLayout());

        jPanel1.setBorder(new javax.swing.border.SoftBevelBorder(javax.swing.border.BevelBorder.RAISED));
        jPanel1.setLayout(new java.awt.GridBagLayout());

        TEXTOARRIBA.setFont(new java.awt.Font("Tahoma", 0, 18)); // NOI18N
        TEXTOARRIBA.setText("TECLA ARRIBA");
        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 0;
        gridBagConstraints.gridy = 1;
        gridBagConstraints.ipadx = 9;
        gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
        gridBagConstraints.insets = new java.awt.Insets(18, 50, 0, 0);
        jPanel1.add(TEXTOARRIBA, gridBagConstraints);

        TeclaArriba.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Q", "W", "E", "R", "T", "Y", "U", "I", "O", "P", "A", "S", "D", "F", "G", "H", "J", "K", "L", "Z", "X", "C", "V", "B", "N", "M", "SPACE", "ENTER" }));
        TeclaArriba.setSelectedIndex(1);

        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 1;
        gridBagConstraints.gridy = 1;
        gridBagConstraints.gridwidth = 4;
        gridBagConstraints.ipady = 2;
        gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
        gridBagConstraints.insets = new java.awt.Insets(18, 18, 0, 15);
        jPanel1.add(TeclaArriba, gridBagConstraints);

        jLabel3.setFont(new java.awt.Font("Tahoma", 0, 24)); // NOI18N
        jLabel3.setText("Escoger teclas del juego");
        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 0;
        gridBagConstraints.gridy = 0;
        gridBagConstraints.gridwidth = 3;
        gridBagConstraints.ipadx = 8;
        gridBagConstraints.ipady = 16;
        gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
        gridBagConstraints.insets = new java.awt.Insets(31, 13, 0, 0);
        jPanel1.add(jLabel3, gridBagConstraints);

        TeclaAbajo.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Q", "W", "E", "R", "T", "Y", "U", "I", "O", "P", "A", "S", "D", "F", "G", "H", "J", "K", "L", "Z", "X", "C", "V", "B", "N", "M", "SPACE", "ENTER" }));
        TeclaAbajo.setSelectedIndex(11);

        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 1;
        gridBagConstraints.gridy = 2;
        gridBagConstraints.gridwidth = 4;
        gridBagConstraints.ipady = 2;
        gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
        gridBagConstraints.insets = new java.awt.Insets(18, 18, 0, 15);
        jPanel1.add(TeclaAbajo, gridBagConstraints);

        TEXTOABAJO.setFont(new java.awt.Font("Tahoma", 0, 18)); // NOI18N
        TEXTOABAJO.setText("TECLA ABAJO");
        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 0;
        gridBagConstraints.gridy = 2;
        gridBagConstraints.ipadx = 17;
        gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
        gridBagConstraints.insets = new java.awt.Insets(18, 50, 0, 0);
        jPanel1.add(TEXTOABAJO, gridBagConstraints);

        TEXTOIZQUIERDA.setFont(new java.awt.Font("Tahoma", 0, 18)); // NOI18N
        TEXTOIZQUIERDA.setText("TECLA IZQUIE.");
        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 0;
        gridBagConstraints.gridy = 3;
        gridBagConstraints.ipadx = 7;
        gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
        gridBagConstraints.insets = new java.awt.Insets(18, 50, 0, 0);
        jPanel1.add(TEXTOIZQUIERDA, gridBagConstraints);

        TeclaIzquierda.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Q", "W", "E", "R", "T", "Y", "U", "I", "O", "P", "A", "S", "D", "F", "G", "H", "J", "K", "L", "Z", "X", "C", "V", "B", "N", "M", "SPACE", "ENTER" }));
        TeclaIzquierda.setSelectedIndex(10);

        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 1;
        gridBagConstraints.gridy = 3;
        gridBagConstraints.gridwidth = 4;
        gridBagConstraints.ipady = 2;
        gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
        gridBagConstraints.insets = new java.awt.Insets(18, 18, 0, 15);
        jPanel1.add(TeclaIzquierda, gridBagConstraints);

        TEXTODERECHA.setFont(new java.awt.Font("Tahoma", 0, 18)); // NOI18N
        TEXTODERECHA.setText("TECLA DERECH.");
        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 0;
        gridBagConstraints.gridy = 4;
        gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
        gridBagConstraints.insets = new java.awt.Insets(18, 50, 0, 0);
        jPanel1.add(TEXTODERECHA, gridBagConstraints);

        TeclaDerecha.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Q", "W", "E", "R", "T", "Y", "U", "I", "O", "P", "A", "S", "D", "F", "G", "H", "J", "K", "L", "Z", "X", "C", "V", "B", "N", "M", "SPACE", "ENTER" }));
        TeclaDerecha.setSelectedIndex(12);
        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 1;
        gridBagConstraints.gridy = 4;
        gridBagConstraints.gridwidth = 4;
        gridBagConstraints.ipady = 2;
        gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
        gridBagConstraints.insets = new java.awt.Insets(18, 18, 0, 15);
        jPanel1.add(TeclaDerecha, gridBagConstraints);

        TEXTOSALTAR.setFont(new java.awt.Font("Tahoma", 0, 18)); // NOI18N
        TEXTOSALTAR.setText("TECLA SALTAR");
        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 0;
        gridBagConstraints.gridy = 5;
        gridBagConstraints.ipadx = 8;
        gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
        gridBagConstraints.insets = new java.awt.Insets(18, 50, 0, 0);
        jPanel1.add(TEXTOSALTAR, gridBagConstraints);

        TeclaSaltar.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Q", "W", "E", "R", "T", "Y", "U", "I", "O", "P", "A", "S", "D", "F", "G", "H", "J", "K", "L", "Z", "X", "C", "V", "B", "N", "M", "SPACE", "ENTER" }));
        TeclaSaltar.setSelectedIndex(26);

        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 1;
        gridBagConstraints.gridy = 5;
        gridBagConstraints.gridwidth = 4;
        gridBagConstraints.ipady = 2;
        gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
        gridBagConstraints.insets = new java.awt.Insets(18, 18, 0, 15);
        jPanel1.add(TeclaSaltar, gridBagConstraints);

        TEXTOSTART.setFont(new java.awt.Font("Tahoma", 0, 18)); // NOI18N
        TEXTOSTART.setText("TECLA START");
        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 0;
        gridBagConstraints.gridy = 6;
        gridBagConstraints.ipadx = 17;
        gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
        gridBagConstraints.insets = new java.awt.Insets(18, 50, 0, 0);
        jPanel1.add(TEXTOSTART, gridBagConstraints);

        TeclaStart.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Q", "W", "E", "R", "T", "Y", "U", "I", "O", "P", "A", "S", "D", "F", "G", "H", "J", "K", "L", "Z", "X", "C", "V", "B", "N", "M", "SPACE", "ENTER" }));
        TeclaStart.setSelectedIndex(27);
        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 1;
        gridBagConstraints.gridy = 6;
        gridBagConstraints.gridwidth = 4;
        gridBagConstraints.ipady = 2;
        gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
        gridBagConstraints.insets = new java.awt.Insets(18, 18, 0, 15);
        jPanel1.add(TeclaStart, gridBagConstraints);

        Aplicar.setText("Aplicar");
        Aplicar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                AplicarActionPerformed(evt);
            }
        });
        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 0;
        gridBagConstraints.gridy = 7;
        gridBagConstraints.gridwidth = 2;
        gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
        gridBagConstraints.insets = new java.awt.Insets(6, 136, 3, 0);
        jPanel1.add(Aplicar, gridBagConstraints);

        add(jPanel1, new java.awt.GridBagConstraints());
    }// </editor-fold>                        
       

    private void AplicarActionPerformed(java.awt.event.ActionEvent evt) {                                        
        // TODO add your handling code here:
    	String ARRIBA = (String) TeclaArriba.getSelectedItem();
    	String ABAJO = (String) TeclaAbajo.getSelectedItem();
    	String DERECHA = (String) TeclaDerecha.getSelectedItem();
    	String IZQUIERDA = (String) TeclaIzquierda.getSelectedItem();
    	String SALTO = (String) TeclaSaltar.getSelectedItem();
    	String START = (String) TeclaStart.getSelectedItem();
    	
    	
    	TECLA_ARRIBA = (ARRIBA.equals("SPACE")? 32: (ARRIBA.equals("ENTER")? 10: ARRIBA.toCharArray()[0]));
    	TECLA_ABAJO = (ABAJO.equals("SPACE")? 32: (ABAJO.equals("ENTER")? 10: ABAJO.toCharArray()[0]));
    	TECLA_DERECHA = (DERECHA.equals("SPACE")? 32: (DERECHA.equals("ENTER")? 10: DERECHA.toCharArray()[0]));
    	TECLA_IZQUIERDA = (IZQUIERDA.equals("SPACE")? 32: (IZQUIERDA.equals("ENTER")? 10: IZQUIERDA.toCharArray()[0]));
    	TECLA_SALTO =  (SALTO.equals("SPACE")? 32: (SALTO.equals("ENTER")? 10: SALTO.toCharArray()[0]));
    	TECLA_START =  (START.equals("SPACE")? 32: (START.equals("ENTER")? 10: START.toCharArray()[0]));
    	
    	CerrarMenuTeclas();
    	
    	
    	
    }                                       


    // Variables declaration - do not modify                     
    private javax.swing.JButton Aplicar;
    private javax.swing.JLabel TEXTOABAJO;
    private javax.swing.JLabel TEXTOARRIBA;
    private javax.swing.JLabel TEXTODERECHA;
    private javax.swing.JLabel TEXTOIZQUIERDA;
    private javax.swing.JLabel TEXTOSALTAR;
    private javax.swing.JLabel TEXTOSTART;
    @SuppressWarnings("rawtypes")
	private javax.swing.JComboBox TeclaAbajo,TeclaArriba,TeclaDerecha,TeclaIzquierda,TeclaSaltar,TeclaStart;
    private javax.swing.JLabel jLabel3;
    private javax.swing.JPanel jPanel1;
    // End of variables declaration   
	
}


